perm filename MIXDPY[MIX,SYS] blob
sn#020814 filedate 1972-02-04 generic text, type T, neo UTF8
COMMENT ⊗ VALID 00004 PAGES
RECORD PAGE DESCRIPTION
00001 00001
00002 00002 This page contains the dpy picture apparatus.
00008 00003 This section has all the display facilities, including
00016 00004 If the PDP address of the word to be displayed is
00019 ENDMK
⊗;
COMMENT ⊗ This page contains the dpy picture apparatus.
⊗
XMAX ←← 777
XMIN ←← -777
YMAX ←← 600
YMIN ←← -200
WIDTH ←← =60
HEIGHT ←← =90
BTWEEN ←← =40
DPYHED: DPYPIC
ENDAD-.
DEFINE LVW (X,Y,M,T)
{ X1 ←← (X)⊗31 ∧ 3777B10
Y1 ←← (Y)⊗16 ∧ 3777B21
X1 ∨ Y1 ∨ M⊗6 ∨ T⊗4 ∨ 6
}
DEFINE LVWBS (X,Y,M,T,B,S)
{ X1 ←← (X)⊗31 ∧ 3777B10
Y1 ←← (Y)⊗16 ∧ 3777B21
X1 ∨ Y1 ∨ B⊗11 ∨ S⊗8 ∨ M⊗6 ∨ T⊗4 ∨ 6
}
DEFINE RETURN (N)
{ LVW N*-=12,-30,0,2
}
DEFINE DPYREG
{ASCID /+ 00 00 00 00 00 /
}
DEFINE DPHREG
{ASCID /+ 000000 0000 /
}
DEFINE DPYDAT
{ASCID /000000000000 /
}
DEFINE DPYAD
{ASCID /0000 /
}
DEFINE DD1 &(A) {↓DDLB&A:}
DEFINE DD2 &(A) {↓DDSZ&A←←.-DDLB&A}
DPYPIC: 0
LVW XMIN,YMAX,1,2
LVW XMAX,YMAX,1,0
LVW XMAX,YMIN,1,0
LVW XMIN,YMIN,1,0
LVW XMIN,YMAX,1,0
LVW BTWEEN,-BTWEEN-HEIGHT,0,2
LVW 0,HEIGHT,0,0
LVW WIDTH/2,-HEIGHT/2,0,0
LVW WIDTH/2,HEIGHT/2,0,0
LVW 0,-HEIGHT,0,0
LVW BTWEEN,0,0,2
LVW 0,HEIGHT,0,0
LVW BTWEEN,-HEIGHT,0,2
LVW WIDTH,HEIGHT,0,0
LVW -WIDTH,0,0,2
LVW WIDTH,-HEIGHT,0,0
LVW XMAX-4*BTWEEN-3*WIDTH,YMAX-BTWEEN-HEIGHT,1,2
LVW 0,HEIGHT,0,0
LVW BTWEEN,0,0,2
LVW WIDTH,0,0,0
LVW 0,-HEIGHT,0,0
LVW -WIDTH,0,0,0
LVW 0,HEIGHT,0,0
LVW WIDTH+BTWEEN,0,0,2
LVW WIDTH,0,0,0
LVW 0,-HEIGHT,0,0
LVW -WIDTH,0,0,0
LVW 0,HEIGHT,0,0
LVW WIDTH+BTWEEN,0,0,2
LVW WIDTH,0,0,0
LVW 0,-HEIGHT,0,0
LVW -WIDTH,0,0,0
LVW WIDTH,HEIGHT/2,0,2
LVW -WIDTH,0,0,0
LVW 0,HEIGHT/2,0,0
LVW XMIN+BTWEEN,250,1,2
DD1(12)
ASCID /rA : /
DPYRA: DPYREG
DD2(12)
RETURN =25
DD1(13)
ASCID /rX : /
DPYRX: DPYREG
DD2(13)
RETURN =25
DD1(14)
ASCID /ri1: /
DPYRI1: DPHREG
DD2(14)
RETURN =25
DD1(15)
ASCID /ri2: /
DPYRI2: DPHREG
DD2(15)
RETURN =25
DD1(16)
ASCID /ri3: /
DPYRI3: DPHREG
DD2(16)
RETURN =25
DD1(17)
ASCID /ri4: /
DPYRI4: DPHREG
DD2(17)
RETURN =25
DD1(20)
ASCID /ri5: /
DPYRI5: DPHREG
DD2(20)
RETURN =25
DD1(21)
ASCID /ri6: /
DPYRI6: DPHREG
DD2(21)
RETURN =25
DD1(11)
ASCID /rJ : /
DPYRJ: DPHREG
DD2(11)
LVW 0,250,1,2
DD1(1)
ASCID /EXECUTE TIME = /
DPYXT: DPYREG
DD2(1)
RETURN =35
DD1(2)
ASCID /PROGRAM COUNTER = /
DPYPC: DPYAD
DD2(2)
RETURN =25
DD1(3)
ASCID /INS: /
DPYIN: DPYREG
DD2(3)
RETURN =25
RETURN 0
DD1(5)
DPYOV: ASCID / OVERFLOW /
DD2(5)
RETURN =15
RETURN 0
DD1(6)
DPYG: ASCID / GREATER /
DD2(6)
RETURN =15
DD1(7)
DPYE: ASCID / → EQUAL/
DD2(7)
RETURN =10
DD1(10)
DPYL: ASCID / LESS /
DD2(10)
ENDAD: XWD DPYPIC, 20
COMMENT ⊗ This section has all the display facilities, including
all the handy-dandy, neat little pictures.
⊗
UPDAD: 0
UPD0: 1
UPD1: 1
OPDEF UPDATE [PUSHJ P, .]
SKIPE DDSW ;ARE WE ON A DD?
JRST .+5 ;YES
MOVNI 10, 1
GETLIN 10
SKIPL 10
POPJ P,
MOVE 10, UPD0
MOVEM 10, UPD1
INDS: MOVE 10, DPYOFF
TLNE FLAGS, OVFLAG
MOVE 10, DPYON
MOVEM 10, DPYOV
MOVE 10, DPYOFF
TLNE FLAGS, GFLAG
MOVE 10, DPYON
MOVEM 10, DPYG
MOVE 10, DPYOFF
TLNE FLAGS, EFLAG
MOVE 10, DPYON
MOVEM 10, DPYE
MOVE 10, DPYOFF
TLNE FLAGS, LFLAG
MOVE 10, DPYON
MOVEM 10, DPYL
REGS: MOVEI 10, REGLST ; INIT ADDRESS COUNTER
MOVEM 10, UPDAD
SKIPN 10, @UPDAD ; 0 → NO MORE
JRST DATS
MOVE 10, (10) ; 10 ← SOURCE WORD
MOVE 12, [POINT 7, REGBLK] ; POINTER TO DESTINATION BLOCK
MOVE 13, [POINT 3, 10, 5] ; POINTER TO SOURCE
MOVEI 11, "+" ; FIRST DO SIGN BIT
SKIPGE 10
ADDI 11, 2 ; CHANGE TO "-"
IDPB 11, 12
IBP 12 ; SPACE
ILDB 11, 13 ; FIRST DIGIT OF PAIR
ADDI 11, 60
IDPB 11, 12
ILDB 11, 13 ; SECOND DIGIT OF PAIR
ADDI 11, 60
IDPB 11, 12
TLNE 13, 770000 ; ANY MORE PAIRS?
JRST .-10 ; YES
HLRZ 10, @UPDAD ; PREPARE FOR TRANSFER TO DPY AREA
MOVE 11, REGBLK
MOVEM 11, (10) ; NOW DO TRANSFER
AOJ 10,
MOVE 11, REGBLK+1
MOVEM 11, (10)
AOJ 10,
MOVE 11, REGBLK+2
MOVEM 11, (10)
AOJ 10,
MOVE 11, REGBLK+3
MOVEM 11, (10)
AOS UPDAD ; GET NEXT REGISTER
JRST REGS+2
DATS: MOVEI 10, DATLST ; INIT ADDRESS COUNTER
MOVEM 10, UPDAD
SKIPN 10, @UPDAD ; 0 → NO MORE
JRST ADS
MOVE 10, (10) ; 10 ← SOURCE WORD
MOVE 12, [POINT 7, DATBLK] ; POINTER TO DESTINATION BLOCK
MOVE 13, [POINT 3, 10] ; POINTER TO SOURCE
ILDB 11, 13
ADDI 11, 60
IDPB 11, 12
TLNE 13, 770000 ; ANY MORE PAIRS?
JRST .-4 ; YES
HLRZ 10, @UPDAD ; PREPARE FOR TRANSFER TO DPY AREA
MOVE 11, DATBLK
MOVEM 11, (10) ; NOW DO TRANSFER
AOJ 10,
MOVE 11, DATBLK+1
MOVEM 11, (10)
AOJ 10,
MOVE 11, DATBLK+2
MOVEM 11, (10)
AOS UPDAD ; GET NEXT REGISTER
JRST DATS+2
ADS: MOVEI 11, ADLST ; INIT ADDRESS COUNTER
MOVEM 11, UPDAD
SKIPN 11, @UPDAD
JRST BYTES
HRRZ 12, (11) ; 12 ← SOURCE WORD
SUBI 12, MC0000
MOVE 13, [POINT 7, ADBLK] ; POINTER TO DESTINATION BLOCK
MOVEI 10, =1000 ; 10 WILL HOLD DIVISOR
MOVE 11, 12 ; SET UP FOR DIVIDE
IDIV 11, 10 ; GET DIGIT
ADDI 11, 60
IDPB 11, 13
IDIVI 10, =10 ; FIX DIVISOR
JUMPG 10, .-5
HLRZ 10, @UPDAD ; PREPARE FOR TRANSFER TO DYP AREA
MOVE 11, ADBLK
MOVEM 11, (10) ; NOW DO TRANSFER
AOS UPDAD ; GET NEXT REGISTER
JRST ADS+2
BYTES: MOVEI 10, BYTLST ; INIT ADDRESS COUNTER
MOVEM 10, UPDAD
SKIPN 10, @UPDAD ; 0 → NO MORE
JRST DPYOUT ;GO WRITE SCREEN (III OR DD)
HRRZ 11, @UPDAD ; UPMEM ← SOURCE ADDRESS
MOVEM 11, UPMEM
MOVEI 13, BYTDES-BYTLST ; UPBYTE ← GROUP DESCRIPTOR
ADD 13, UPDAD
MOVE 12, (13)
MOVEM 12, UPBYTE
MOVNI 12, 4 ; UPBTIM ← COUNTER FOR GROUP #
MOVEM 12, UPBTIM
MOVE 13, [XWD DPYMDL, DPYWRK] ; SET UP WORK AREA
BLT 13, DPYWRK-DPYMDL+DPYWRK-1
MOVE 13, [POINT 7, DPYWRK] ; AND POINTER
MOVEM 13, UPOINT
MOVEI 13, "+" ; GET SIGN
SKIPGE @UPMEM
MOVEI 13, "-"
IDPB 13, UPOINT
IBP UPOINT
NXTGRP: MOVE 13, UPBYTE ; 13 ← 5*n+i
IMULI 13, 5
ADD 13, UPBTIM
SKIPN DPYPTR+4(13)
JRST ALLDON ; 0 → ALL DONE
LDB 12, DPYPTR+4(13) ; GET BYTE GROUP
MOVE 10, DPYDIV+4(13) ; 10 ← DIVISOR
MOVE 11, 12
IDIV 11, 10
ADDI 11, 60
IDPB 11, UPOINT ; PUT DIGIT INTO WORK AREA
IDIVI 10, =10 ; NEXT DIVISOR
JUMPG 10, .-5 ; BACK FOR MORE DIGITS
IBP UPOINT ; SPACE AFTER GROUP
AOSG UPBTIM ; MORE GROUPS?
JRST NXTGRP ; YES
ALLDON: MOVEI 13, 3
HLRZ 10, @UPDAD
HRRM 10, .+2
MOVE 11, DPYWRK(13)
MOVEM 11, 0(13)
SOJGE 13, .-2
AOS UPDAD
JRST BYTES+2
DPYOUT: SKIPE DDSW ;IS THIS A DATA DISK
JRST DDUPD ;YES, UPDATE SCREEN (DDUPD DOES A POPJ)
UPGIOT DPYHED ;REWRITE III SCREEN
POPJ P,
DPYOFF: ASCID / /
DPYON: ASCID / → /
REGLST: 0
REGBLK: DPYREG
DATLST: 0
DATBLK: DPYDAT
ADLST: XWD DPYPC, PC
0
ADBLK: DPYAD
BYTLST: XWD DPYIN, INSTR
XWD DPYRA, RA
XWD DPYRX, RX
XWD DPYRI1, R1
XWD DPYRI2, R2
XWD DPYRI3, R3
XWD DPYRI4, R4
XWD DPYRI5, R5
XWD DPYRI6, R6
XWD DPYRJ, RJ
XWD DPYXT, EXTIME
0
BYTDES: 7
17
17
2
2
2
2
2
2
2
0
0
UPMEM: 0
UPBTIM: 0
UPOINT: 0
UPBYTE: 0
DPYMDL: ASCID / /
DPYWRK: ASCID / /
QUPDAT: MOVNI 10, 1 ; IS IT A DPY
GETLIN 10
JUMPGE 10, .+3 ; NO → DON'T UPDATE
PGSEL 0 ; PICK PIECE OF GLASS
UPDATE
JRST BUTTON
COMMENT ⊗ If the PDP address of the word to be displayed is
in UPMEM then the following tables can be used to
get the appropriate byte groups for updating the
display.
n = a 4-bit number, where bit k is on if
byte k in the MIX word should begin
a new grouping. (e.g. standard
instruction format is:
n=7 or + AA I F C)
i = the # of the group which you wish to use (1≤i≤5)
DPYPTR+5*n+i-1 is a byte pointer to the right bytes
or 0 if no bytes left
DPYDIv+5*n+i-1 contains the divisor to start finding
the digits with
⊗
ULIST1
DPYPTR: FOR I←0,17
{ULIST2
X1←←X2←←X3←←X4←←X5←←6
Y1←←=11
Y2←←=17
Y3←←=23
Y4←←=29
Y5←←=35
Z←←1
FOR @$ J←3,0,-1
{IFE I∧1⊗J,
{FOR @! K←Z,Z
{X!K←←X!K+6
Y!K←←Y!K+6
⎇
FOR @! K←Z+1,4
{FOR @% K1←K+1,K+1
{X!K←←X%K1
Y!K←←Y%K1
⎇
⎇
⎇
IFN I∧1⊗J, {Z←←Z+1⎇
⎇
FOR @$ J←1,Z
{ POINT X$J, @UPMEM, Y$J
⎇
FOR J←Z+1,5
{ 0
⎇
⎇
LIST
ULIST1
DPYDIV: FOR I←0,17
{ULIST2
X1←←X2←←X3←←X4←←X5←←6
Z←←1
FOR @$ J←3,0,-1
{IFE I∧1⊗J,
{FOR @! K←Z,Z
{X!K←←X!K+6
⎇
FOR @! K←Z+1,4
{FOR @% K1←K+1,K+1
{X!K←←X%K1
⎇
⎇
⎇
IFN I∧1⊗J, {Z←←Z+1⎇
⎇
FOR @$ J←1,5
{D←←1
FOR K←1,X$J/3-1
{D←←=10*D
}
D
}
}
LIST